perm filename EULER[GEO,BGB]1 blob
sn#025306 filedate 1973-03-07 generic text, type T, neo UTF8
00100 TITLE EULER - EULER PRIMITIVES - JULY 1972.
00200
00300 COMMENT /
00400 These primitives preserve the Euler Equation F-E+V = 2*B-2*H;
00500
00600 INVERT(E); "|" COMMAND.
00700 EVERT(B); "¬" COMMAND.
00800 VNEW ← MKEV(F,V); "E" COMMAND.
00900 ENEW ← MKFE(V1,F,V2); "J" COMMAND.
01000 VNEW ← ESPLIT(E); "M" COMMAND.
01100 F ← KLFE(ENEW); "K" COMMAND.
01200 E ← KLEV(VNEW); "K" COMMAND.
01300 V ← KLVE(ENEW); "αK" COMMAND.
01400 BNEW ← MKCOPY(B); "C" COMMAND.
01500 ENEW ← GLUEE(F1,V1,F2,V2); "J" COMMAND.
01600 /
01700
01800 ;THE EULER PRIMITVES ARE DEPENDENT ON THE WING OPERATIONS.
01900 EXTERN MAKE,KILL
02000 EXTERN MKB,MKF,MKE,MKV
02100 EXTERN KLB,KLF,KLE,KLV,WING
02200 EXTERN WING,LINKED
02300 EXTERN ECW,ECCW,OTHER,OTHER.
02400 EXTERN BODY,FCW,FCCW,VCW,VCCW
02500
02600 ;BIT FOR MARKING EDGES OF A WASP FACE'S WAIST.
02700 ↓WASP←←1B5
00100 SUBR(INVERT)------------------------------------------------------
00200 BEGIN INVERT
00300 LAC 1,ARG1
00400 MOVSS 1(1)↔MOVSS 3(1)↔MOVSS 4(1)↔MOVSS 5(1)
00500 MOVNS -3(1)↔MOVNS -2(1)↔MOVNS -1(1)
00600 POP1J
00700 BEND;1/14/73------------------------------------------------------
00800
00900 ;EVERT(B) - TURN BODY INSIDE OUT.
01000 SUBR(EVERT)BODY --------------------------------------------------
01100 BEGIN EVERT; TURN SOMETHING INSIDE OUT.
01200 ACCUMULATORS{B,E}
01300 CDR B,ARG1
01400 TEST B,BBIT↔POP1J
01500 LAC E,B
01600 L1: PED E,E
01700 TEST E,EBIT↔GO L3
01800 MOVSS 1(E)
01900 MOVS 4(E)↔MOVS 1,5(E)
02000 DAC 1,4(E)↔DAC 5(E)
02100 GO L1
02200
02300 ;PARTS OF THIS BODY.
02400 L3: SON 1,B↔JUMPE 1,POP1J.
02500 L4: PUSH P,1↔CALL(EVERT,1)
02700 POP P,1↔LAC B,ARG1
02800 BRO 1,1↔SON 0,B
02900 CAME 0,1↔GO L4↔POP1J
03000 BEND;1/14/73------------------------------------------------------
00100 ;VNEW ← MKEV(F,V). "E" COMMAND.
00200 SUBR(MKEV)--------------------------------------------------------
00300 BEGIN MKEV
00400 ACCUMULATORS {VNEW,B,F,V,ENEW,E1,E2}
00500
00600 ;CHECK FOR BAD ARGUMENTS.
00700 CDR VNEW,ARG1;FOR BAD RETURNS.
00800 LAC V,ARG1↔TEST(V,VBIT)↔POP2J
00900 LAC F,ARG2↔TEST(F,FBIT)↔POP2J
01000
01100 ;CREATE A NEW EDGE AND VERTEX.
01200 SETQ(B,{BODY,V})
01300 SETQ(VNEW,{MKV,B})
01400 SLACI XWC(V)↔LAPI XWC(VNEW)↔BLT ZWC(VNEW)
01450 LAC 1(V)↔DAC 1(VNEW)
01500 SETQ(ENEW,{MKE,B})
01600
01700 ;MAKE FACE AND VERTEX LINKS.
01800 PED. ENEW,VNEW
01900 NFACE. F,ENEW
02000 PFACE. F,ENEW
02100 NVT. VNEW,ENEW
02200 PVT. V,ENEW
02300
02400 ;CHECK FOR VERTEX BODY CASE.
02500 PED E1,F↔JUMPE E1,[
02600 PED. ENEW,F↔PED. ENEW,V
02700 PCW. ENEW,ENEW↔NCCW. ENEW,ENEW↔GO .+1]
02800
02900 ;LOWER WINGS POINT AT SELF.
03000 NCW. ENEW,ENEW
03100 PCCW. ENEW,ENEW
03200
03300 ;GET THE UPPER WINGS.
03400 PED E1,V↔LAC E2,E1
03500 NFACE 0,E1↔PFACE 1,E1
03600 CAMN 0,1↔GO L2
03700 L1: LAC E1,E2
03800 SETQ(E2,{ECW,E1,V})
03900 CALL(FCW,E1,V)
04000 CAME 1,F↔GO L1
04100
04200 ;TIE ENEW TO ITS UPPER WINGS.
04300 L2: PCW. E1,ENEW↔NCCW. E2,ENEW
04400 PVT 0,E1↔CAME 0,V↔GO[PCCW. ENEW,E1↔GO .+2]↔NCCW. ENEW,E1
04500 PVT 0,E2↔CAME 0,V↔GO[NCW. ENEW,E2↔GO .+2]↔PCW. ENEW,E2
04600 LAC 1,VNEW↔POP2J
04700 LIT
04800 BEND;1/14/73------------------------------------------------------
00100 ;ENEW ← MKFE(V1,F,V2); "J" COMMAND.
00200 SUBR(MKFE)--------------------------------------------------------
00300 BEGIN MKFE
00400 ACCUMULATORS{V1,F,V2,FNEW,ENEW,E,E0,B}
00500
00600 ;FETCH THE ARGUMENTS.
00700 CDR V1,ARG3
00800 CDR F,ARG2
00900 CDR V2,ARG1
01000
01100 ;DO THE CREATIONS.
01200 SETQ(B,{BODY,F})
01300 SETQ(FNEW,{MKF,B})
01400 SETQ(ENEW,{MKE,B})
01500
01600 ;LINK ENEW.
01700 PED. ENEW,F↔ PED. ENEW,FNEW
01800 PFACE. F,ENEW↔ NFACE. FNEW,ENEW
01900 PVT. V1,ENEW↔ NVT. V2,ENEW
02000
02100 ;GET THE UPPER WINGS.
02200 PED E,V1↔LAC E0,E↔MOVS 1(E)↔CAME 1(E)
02300 GO[L1: LAC E0,E↔ SETQ(E,{ECW,E0,V1})
02400 CALL(FCW,E0,V1)↔CAME 1,F↔GO L1↔GO .+1]
02500 DAC E0,E1#↔DAC E,E2#
02600
02700 ;GET THE LOWER WINGS.
02800 PED E,V2↔LAC E0,E↔MOVS 1(E)↔CAME 1(E)
02900 GO[L2: LAC E0,E↔ SETQ(E,{ECW,E0,V2})
03000 CALL(FCW,E0,V2)↔CAME 1,F↔GO L2↔GO .+1]
03100 DAC E0,E3#↔DAC E,E4#
03200
03300 COMMENT . MKFE MANDALA
03400 o--------o o--------o
03500 | E2 \ / E1 |
03600 | nccw \ / pcw |
03700 | \ / |
03800 | pvt ⊗ V1 |
03900 | | |
04000 | FNEW ENEW F |
04100 | | |
04200 | nvt ⊗ V2 |
04300 | / \ |
04400 | ncw / \ pccw |
04500 | E3 / \ E4 |
04600 o--------o o--------o
04700
04800 -----------------------------------------------------------------.
00100 ;CDR V2'S TAIL REPLACING +F'S WITH FNEW.
00200 LAC E,E3
00300 L3: MOVS 1,1(E)↔CAME 1,1(E)↔GO L4
00400 PFACE. FNEW,E
00500 PCW E,E↔GO L3
00600
00700 ;CCW FROM V1 REPLACING F'S WITH FNEW.
00800 L4: LAC E0,E↔LAC E,E2↔SETZM A#↔CAMN E0,E2↔GO L6
00900 L5: TESTZ E,WASP↔JSR WASPS
01000 NFACE 0,E
01100 CAME F,0
01200 GO[PFACE. FNEW,E↔GO .+2]
01300 NFACE. FNEW,E
01400 CAME E,E0
01500 GO[DAC E,A↔SETQ(E,{ECCW,E,FNEW})↔GO L5]
01600
01700 ;LINK THE WINGS.
01800 L6: CALL(WING,E1,ENEW)
01900 CALL(WING,E2,ENEW)
02000 CALL(WING,E3,ENEW)
02100 CALL(WING,E4,ENEW)
02200 L7: LAC 1,ENEW↔POP3J
02300
02400 WASPS: 0
02500
02600 PCW 1,E↔CAMN 1,A↔GO W1
02700 PCCW 1,E↔CAME 1,A↔GO W2
02800
02900 W1: SETZM A↔MARKZ E,WASP
03000 PFACE. FNEW,E↔SETQ(E,{ECCW,E,FNEW})
03100 TESTZ E,WASP↔GO W1↔GO @WASPS
03200
03300 W2: SETZM A↔MARKZ E,WASP
03400 NFACE. FNEW,E↔SETQ(E,{ECCW,E,FNEW})
03500 TESTZ E,WASP↔GO W2↔GO @WASPS
03600
03700 LIT
03800 BEND;1/14/73------------------------------------------------------
00100 ;VNEW ← ESPLIT(E); "M" COMMAND.
00200 SUBR(ESPLIT)------------------------------------------------------
00300 BEGIN ESPLIT
00400 ACCUMULATORS{VNEW,ENEW,B,E,V}
00500
00600 ;CHECK FOR BAD ARGUMENTS.
00700 CDR VNEW,ARG1
00800 LAC E,VNEW
00900 TEST E,EBIT↔GO L1
01000 PVT V,E
01100
01200 ;CREATE A NEW EDGE AND VERTEX.
01300 PBODY B,E
01400 SETQ(VNEW,{MKV,B})
01500 SETQ(ENEW,{MKE,B})
01600 SLACI AA(E)↔LAPI AA(ENEW)↔BLT CC(ENEW)
01700
01800 ;PLACE VNEW BETWEEN E AND ENEW.
01900 PED 0,V↔CAMN 0,E↔PED. ENEW,V
02000 PED. ENEW,VNEW
02100 PVT 0,E↔PVT. 0,ENEW
02200 PVT. VNEW,E
02300 NVT. VNEW,ENEW
02400 PFACE 0,E↔PFACE. 0,ENEW
02500 NFACE 0,E↔NFACE. 0,ENEW
02600
02700 ;NEW UPPER WINGS ARE LIKE THE OLDE;
02800 PCW 0,E↔CALL(WING,0,ENEW)
02900 NCCW 0,E↔CALL(WING,0,ENEW)
03000
03100 ;EDGES POINT AT EACH OTHER ACROSS VNEW.
03200 NCCW. ENEW,E↔PCW. ENEW,E
03300 NCW. E,ENEW↔PCCW. E,ENEW
03400 L1: LAC 1,VNEW↔POP1J
03500
03600 BEND;1/14/73------------------------------------------------------
00100 ;F ← KLFE(ENEW); "K" COMMAND.
00200 SUBR(KLFE)--------------------------------------------------------
00300 BEGIN KLFE
00400 ACCUMULATORS{ENEW,FNEW,V1,V2,E1,E2,E3,E4,E,F,B}
00500
00600 ;PICK THINGS UP.
00700 CDR ENEW,ARG1
00800 PFACE F,ENEW↔ NFACE FNEW,ENEW
00900 PVT V1,ENEW↔ NVT V2,ENEW
01000
01100 ;GET THE WINGS.
01200 PCW E1,ENEW
01300 NCCW E2,ENEW
01400 NCW E3,ENEW
01500 PCCW E4,ENEW
01600
01700 ;GET RID OF ENEW APPEARANCES IN F & V.
01800 PED 0,V1↔ CAMN 0,ENEW↔ PED. E1,V1
01900 PED 0,V2↔ CAMN 0,ENEW↔ PED. E3,V2
02000 PED 0,F ↔ CAMN 0,ENEW↔ PED. E3,F
02100
02200 ;GET RID OF FNEW APPEARANCES
02300 LAC E,E2
02400 L1: PFACE 0,E↔CAMN 0,FNEW↔GO[PFACE. F,E↔GO L2]
02500 NFACE 0,E↔CAMN 0,FNEW↔GO[NFACE. F,E↔GO L2]
02600 FATAL(KLFE)
02700 L2: CAME E,E3↔GO[SETQ(E,{ECCW,E,F})↔GO L1]
02800
02900 ;LINK WINGS TOGETHER ABOUT F.
03000 CALL(WING,E2,E1)
03100 CALL(WING,E4,E3)
03200
03300 ;GET RID OF FNEW AND ENEW.
03400 PBODY B,ENEW
03500 CALL(KLF,B,FNEW)
03600 CALL(KLE,B,ENEW)
03700 LAC 1,F↔POP1J
03800
03900 BEND;1/14/73------------------------------------------------------
00100 ;E ← KLEV(VNEW); "K" COMMAND.
00200 SUBR(KLEV)--------------------------------------------------------
00300 BEGIN KLEV
00400 ACCUMULATORS{E,ENEW,V,VNEW,F,B}
00500 CDR VNEW,ARG1↔PED ENEW,VNEW
00600 SETQ(E,{ECCW,ENEW,VNEW})
00700 CAMN E,ENEW↔GO[SETQ(V,{OTHER,ENEW,VNEW}) ;EAT WIRE.
00800 SETQ(E,{ECCW,ENEW,V})↔NCW. E,E↔PCCW. E,E↔GO L1]
00900 CALL(ECCW,E,VNEW)↔CAME 1,ENEW
01000 GO[CALL(KLFE,1)↔GO KLEV]
01100
01200 ;ORIENT EDGES AS IN MANDALA.
01300 NVT 0,ENEW↔CAMN 0,VNEW↔GO .+3↔CALL(INVERT,ENEW)
01400 PVT 0,E↔CAMN 0,VNEW↔GO .+3↔CALL(INVERT,E)
01500 ;TIE E TO ITS NEW VERTEX.
01600 PVT V,ENEW↔ PVT. V,E
01700 ;MAKE E'S UPPER WINGS LIKE ENEW'S.
01800 PCW 0,ENEW↔CALL(WING,0,E)
01900 NCCW 0,ENEW↔CALL(WING,0,E)
02000
02100 ;ELIMINATE OCCURENCES OF ENEW IN F & V.
02200 L1: PED 0,V↔ CAMN 0,ENEW↔ PED. E,V
02300 PFACE F,E↔ PED 0,F↔ CAMN 0,ENEW↔ PED. E,F
02400 NFACE F,E↔ PED 0,F↔ CAMN 0,ENEW↔ PED. E,F
02500 ;PURGE 'EM.
02600 PBODY B,ENEW
02700 CALL(KLV,B,VNEW)
02800 CALL(KLE,B,ENEW)
02900 LAC 1,E↔SLAC 1(1)↔CAMN 1(1)↔NVT 1,1
02950 POP1J↔LIT
03000 COMMENT . \ pvt / KLEV MANDALA
03100 \ /
03200 nccw \ / pcw
03300 \ /
03400 V ⊗
03500 |
03600 ENEW |
03700 | nvt
03800 VNEW ⊗
03900 | pvt
04000 E |
04100 |
04200 ⊗
04300 / \
04400 ncw / \ pccw
04500 / \
04600 / nvt \ .
04700 BEND;1/14/73------------------------------------------------------
00100 ; V ← KLVE(E) - KILL E & NVT(E) RETURNING PVT(E).
00200 SUBR(KLVE)--------------------------------------------------------
00300 BEGIN KLVE
00400 ACCUMULATORS{A,E,E1,E2,E3,E4,V1,V2,S12}
00500
00600 ;PICK THINGS UP.
00700 CDR E,ARG1↔NVT V1,E↔PVT V2,E
00800 PCW E1,E↔NCCW E2,E↔NCW E3,E↔PCCW E4,E
00900
01000 ;REPLACE FACE-VERTEX PED'S THAT MIGHT CONTAIN E.
01100 PFACE 1,E↔PED 0,1↔CAMN 0,E↔PED. E1,1
01200 NFACE 1,E↔PED 0,1↔CAMN 0,E↔PED. E2,1
01300 PED 0,V2↔CAMN 0,E↔PED. E2,V2
01400
01500 ;REPLACE V1 WITH V2.
01600 LAC A,E3
01700 L1: PVT 1,A↔CAME 1,V1↔GO[NVT. V2,A↔GO .+2]↔PVT. V2,A
01800 SETQ(A,{ECCW,A,V2})
01900 CAME A,E↔GO L1
02000
02100 ;SPLICE WINGS TOGETHER.
02200 CALL(WING,E1,E4)
02300 CALL(WING,E2,E3)
02400
02500 ;BURN THE GARBAGE.
02600 PBODY A,E
02700 CALL(KLE,A,E)
02800 CALL(KLV,A,V1)
02900 LAC 1,V2
03000 POP1J
03100 LIT
03200 BEND;1/14/73------------------------------------------------------
03300 COMMENT . KLVE MANDALA
03400 E2 \ / E1
03500 nccw \ / pcw
03600 \ /
03700 pvt ⊗ V2
03800 |
03900 | E
04000 |
04100 nvt ⊗ V1
04200 / \
04300 ncw / \ pccw
04400 E3 / \ E4.
00100 ;BNEW ← MKCOPY(B).
00200 SUBR(MKCOPY)------------------------------------------------------
00300 BEGIN MKCOPY
00600 ACCUMULATORS{B,F,E,V,BNEW,Q,A}
00700 EXTERN WORLD,MKLOCOR
00800 LAC B,ARG1
00900 TEST B,BBIT↔POP1J↔SETQ(BNEW,{MKB})
00950 LOCOR Q,B↔SKIPE Q↔GO[CALL(MKLOCOR)↔LOCOR. 1,BNEW
00975 SLACI XWC(Q)↔LAPI XWC(1)↔BLT KZ(1)↔GO .+1]
01000 LAC B,ARG1↔LAC F,B↔LAC E,B↔LAC V,B
01100
01200 ;FOR ALL THE EDGES OF THE BODY.
01300 L1: PED E,E↔TEST E,EBIT↔GO L2
01700 SETQ(Q,{MKE,BNEW})↔ALT. Q,E↔GO L1
01800
01900 ;FOR ALL THE FACES OF THE BODY.
02000 L2: PFACE F,F↔TEST F,FBIT↔GO L3
02100 SETQ(Q,{MKF,BNEW})↔ALT. Q,F
02200 PED A,F↔ALT A,A↔PED. A,Q
02300 LAC QQ(F)↔DAC QQ(Q)↔GO L2
02400
02500 ;FOR ALL THE VERTICES OF THE BODY.
02600 L3: PVT V,V↔TEST V,VBIT↔GO L4
02700 SETQ(Q,{MKV,BNEW})↔ALT. Q,V
02800 PED A,V↔ALT A,A↔PED. A,Q
02900 SLACI XWC(V)↔LAPI XWC(Q)↔BLT ZWC(Q)↔GO L3
03000
03100 ;FOR ALL THE EDGES OF THE BODY.
03200 L4: PED E,E↔TEST E,EBIT↔GO L5
03300 ALT Q,E
03400 PVT V,E↔ ALT V,V↔PVT. V,Q
03500 NVT V,E↔ ALT V,V↔NVT. V,Q
03600 PFACE F,E↔ALT F,F↔PFACE. F,Q
03700 NFACE F,E↔ALT F,F↔NFACE. F,Q
03800 NCW A,E↔ ALT A,A↔NCW. A,Q
03900 PCW A,E↔ ALT A,A↔PCW. A,Q
04000 NCCW A,E↔ ALT A,A↔NCCW. A,Q
04100 PCCW A,E↔ ALT A,A↔PCCW. A,Q
04200 GO L4
04300 L5: SETZ↔LAC 1,BNEW↔LAC E,ARG1
04400 L6: PED E,E↔TEST E,EBIT↔POP1J
04500 ALT. 0,E↔GO L6
04600 BEND;1/14/73------------------------------------------------------
00100 ;ENEW ← GLUEE(F1,V1,F2,V2) - LIKE TWO MKEV(F,V)'S BACK TO BACK.
00200 SUBR(GLUEE)-------------------------------------------------------
00300 BEGIN GLUEE
00400 Q←1
00500 ACCUMULATORS{F1,V1,F2,V2,B,E,E1,E2,E3,E4}
00600 CDR F1,ARG4↔CDR V1,ARG3
00700 CDR F2,ARG2↔CDR V2,ARG1
00800 ;BODY SPLICING.
00900 PED E,F1↔PBODY B,E
01000 PED E,F2
01100
01200 ;REPLACE F2 WITH F1.
01300 PED E,F2↔DAC E,E0#
01400 L1: PFACE Q,E↔CAMN Q,F2↔PFACE. F1,E
01500 NFACE Q,E↔CAMN Q,F2↔NFACE. F1,E
01600 SETQ(E,{ECCW,E,F1})
01700 CAME E,E0↔GO L1
01800 CALL(KLF,B,F2)
01900
00100 COMMENT . GLUEE MANDALA
00200
00300 | | |
00400 | +V2 |
00500 | / | \ |
00505 | / | \ |
00600 NCCW | E2/ | \E1 | PCW
00606 | / | \ |
00700 | / F2 | F2 \ |
00800 o______ | ______o
00900 | HOWEVER,
01000 WASP | ENEW GLUEE RETURN'S ENEW INVERTED
01100 o______ | ______o
01200 |\ | /|
01300 | \ F1 | F1 / |
01400 | \ | / |
01500 NCW | E3\ | /E4 | PCCW
01600 | \ | / |
01700 | \ | / |
01800 | -V1 |
01900 | | |
02000 | | | .
02100 ;EDGE CREATION
02200 SETQ(E,{MKE,B})
02300 MARK E,WASP
02400 NFACE. F1,E↔PFACE. F1,E
02500 NVT. V1,E↔PVT. V2,E
02600
02700 ;MAKE WINGS
02800 SETQ(E1,{ECW,V2,F1})↔PCW. E1,E
02900 SETQ(E2,{ECW,E1,V2})↔NCCW. E2,E
03000 SETQ(E3,{ECW,V1,F1})↔NCW. E3,E
03100 SETQ(E4,{ECW,E3,V1})↔PCCW. E4,E
03200
03300 PVT Q,E1↔CAME Q,V2↔GO[PCCW. E,E1↔GO .+2]↔NCCW. E,E1
03400 PVT Q,E2↔CAME Q,V2↔GO[NCW. E,E2↔GO .+2]↔PCW. E,E2
03500 PVT Q,E3↔CAME Q,V1↔GO[PCCW. E,E3↔GO .+2]↔NCCW. E,E3
03600 PVT Q,E4↔CAME Q,V1↔GO[NCW. E,E4↔GO .+2]↔PCW. E,E4
03700
03800 ;MARK WASP WAIST ON POTENTIAL SPUR STARTING AT V1.
03900 CAME E1,E2↔GO L2
04000 MARK E1,WASP↔PVT V1,E1↔PED E1,V1
04100 MOVS Q,1(E1)↔CAMN Q,1(E1)↔GO .-5
04200
04300 L2: LAC Q,E↔CALL(INVERT,Q)↔POP4J
04400 LIT
04500 BEND;1/14/73------------------------------------------------------
00100 SUBR(GLUE)F1,F2---------------------------------------------------
00200 BEGIN GLUEFF;GLUE TWO FACES TOGETHER - BGB 10 FEBRUARY 1973.
00300 EXTERN DISTAN
00400 ;ARGUMENTS MUST BE FACES WITH THE SAME NUMBER OF VERTICES.
00500 LAC 1,ARG1↔DAC 1,F1↔TEST 1,FBIT↔POP2J
00600 LAC 1,ARG2↔DAC 1,F2↔TEST 1,FBIT↔POP2J
00700 LAC 1,F1↔PED 2,1↔DAC 2,E↔DAC 2,E0↔LACI 10,1
00800 L1: SETQ(E,{ECCW,E,F1})↔CAME 1,E0↔AOJA 10,L1↔DAC 10,NN
00900 LAC 1,F2↔PED 2,1↔DAC 2,E↔DAC 2,E0↔SOS 10
01000 L2: SETQ(E,{ECCW,E,F2})↔CAME 1,E0↔SOJA 10,L2↔SKIPE 10↔POP2J
01100
01200 ;FIND V2 CLOSEST TO V1.
01300 LAC 1,F1↔PED 2,1↔SETQ(V1,{VCW,2,1})
01400 HRLOI 377777↔DAC MIN
01500 SETZM LIST1↔SETZM LIST2
01600 L3: SETQ(V,{VCW,E,F2})
01700 CALL(DISTAN,V,V1)
01800 CAMGE 1,MIN↔GO[DAC 1,MIN↔LAC V↔DAC V2↔GO .+1]
01900 LAC 1,E↔LAC LIST1↔DAP -1(1)↔DAC 1,LIST1
02000 LAC 1,V↔LAC LIST2↔DAP -1(1)↔DAC 1,LIST2
02100 SETQ(E,{ECCW,E,F2})
02200 CAME 1,E0↔GO L3
02300 CALL(GLUEE,F1,V1,F2,V2)
02400 CALL(INVERT,1)
02500
02600 ;CLOSE UP THE GAP.
02700 SOS NN
02800 L4: PCCW 0,1↔PUSH P,0↔PCW 0,1↔PUSH P,0
02900 SETQ(V2,{OTHER,V2})↔SETQ(V1,{OTHER,V1})
03000 CALL(MKFE,V2,F1,V1)↔SOSLE NN↔GO L4
03100
03200 ;NOW KILL ALL THOSE EDGES.
03300 L5: SKIPN 1,LIST1↔GO L6↔CDR 0,-1(1)↔DAC 0,LIST1
03400 CALL(KLFE,1)↔GO L5
03500 L6: SKIPN 1,LIST2↔GO L7↔CDR 0,-1(1)↔DAC 0,LIST2
03600 CALL(KLEV,1)↔GO L6
03700
03800 L7: LAC 1,F1↔PED 1,1↔PBODY 1,1
03900 POP2J
04000 DECLARE{F1,F2,V,V1,V2,NN,E,E0,MIN,LIST1,LIST2}
04100 BEND;2/10/73------------------------------------------------------
00100 SUBR(SWEEP)FACE,FLAG----------------------------------------------
00200 BEGIN SWEEP
00300
00400 ;TEST FOR VALID ARGUMENT.
00500 LAC 1,ARG2↔DAC 1,F↔TEST 1,FBIT↔POP2J
00600 PED 2,1↔DAC 2,E↔SKIPN 2↔POP2J
00700 TEST 2,EBIT↔POP2J
00800
00900 ;TEST FOR SPECIAL CASES.
01000 PCW 3,2↔CAMN 3,2↔GO SWEEP2 ;WIRE SWEEP CASE.
01100 SETZM E0↔NCNT 0,1↔DACM NN
01200 SKIPE↔SETZM ARG1
01300
01400 ;MAKE FIRST SPOKE.
01500 CALL(VCW,E,F)↔DAC 1,U0↔DAC 1,U1
01600 CALL(MKEV,F,U0)↔DAC 1,V0↔DAC 1,V1
01700
01800 ;COPY FACE PERIMETER LOOP.
01900 L1: SETQ(U2,{VCCW,E,F}) ;ADVANCE ALONG RIM.
02000 SETQ(E,{ECCW,E,F})
02100 LAC 1,U2↔CAME 1,U0 ;MAKE NEXT SPOKE.
02200 GO[CALL(MKEV,F,U2)↔GO .+2]
02300 LAC 1,V0↔DAC 1,V2
02400 CALL(MKFE,V1,F,V2) ;CONNECT SPOKES.
02500 SKIPN E0↔DAC 1,E0 ;NEW FIRST EDGE.
02600
02700 ;SPLIT NEW FACE TO MAKE PRISMOIDS.
02800 NFACE 0,1
02900 SKIPGE ARG1↔GO[CALL(MKFE,V1,0,U2)↔GO .+3] ;CW -1.
03000 SKIPLE ARG1↔GO[CALL(MKFE,U1,0,V2)↔GO .+1] ;CCW +1.
03100
03200 ;TEST FOR END OF COPY LOOP.
03300 LAC V2↔DAC V1
03400 LAC U2↔DAC U1
03500 SOSN NN↔GO .+3
03600 CAME U0↔GO L1 ;EXIT WHEN NN=0 OR U2=U0
03700 ;EXIT.
03800 LAC 0,E0↔LAC 1,F
03900 PED. 0,1↔POP2J
04000
04100 DECLARE{F,E,E0,U0,U1,U2,V0,V1,V2,NN}
04200 COMMENT . U2 o----------o U1 FACE SWEEP MANDALA
04300 / \ / \
04400 / \ FNEW / \
04500 / \____/ \
04600 / v2 v1 \
04700 / F \.
04800 BEND;2/7/73-------------------------------------------------------
00100 SWEEP2:;FACE,FLAG-------------------------------------------------
00200 BEGIN SWEEP2;WIRE FACE SWEEP - BGB - 7 FEB 1973.
00300
00400 ;COUNT THE EDGES IN THE WIRE.
00500 LAC 3,ARG2↔DAC 3,FACE ;FACE
00600 PED 1,3↔LACI 0,1 ;EDGE & NCNT.
00700 LAC 2,1↔NCW 1,1
00800 CAME 1,2↔AOJA 0,.-3 ;COUNT THE EDGES.
00900
01000 ;MAKE "BOTTOM" EDGE.
01100 DAC 1,E ;LAST EDGE.
01200 NCNT. 0,3↔DAC NN
01300 NVT 1,1 ;LAST VERTEX OF THE WIRE.
01400 SETQ(V2,{MKEV,FACE,1}) ;BOTTOM EDGE.
01500
01600 ;COPY THE WIRE.
01700 L1: SETQ(V2,{MKEV,FACE,V2})
01800 LAC 3,E↔PVT 2,3↔DAC 2,V1
01900 SLACI XWC(2)↔LAPI XWC(1)↔BLT ZWC(1)
02000 PCW 2,3↔DAC 2,E↔CAME 2,3↔GO L1
02100
02200 ;CLOSE THE TOP.
02300 SETQ(E,{MKFE,V1,FACE,V2})
02400 NFACE 1,1↔DAC 1,FNEW
02500 SOSG NN↔GO L3
02600
02700 ;FOLLOW DOWN BOTH SIDES.
02800 L2: CALL(ECCW,E,FNEW)↔SETQ(V1,{OTHER,1,V1})
02900 CALL(ECW,E,FNEW)↔SETQ(V2,{OTHER,1,V2})
03000 SETQ(E,{MKFE,V2,FNEW,V1})
03100 SOSLE NN↔GO L2
03200
03300 ;UPDATE THE FIRST EDGE OF THE FACE.
03400 L3: LAC 2,ARG2↔PED 1,2
03500 CALL(ECCW,1,2)↔PED. 1,2
03600 LAC 1,2↔POP2J
03700
03800 COMMENT . ⊗ ⊗-------⊗ ⊗-------⊗
03900 + | | | | |
04000 PED(F) | | | | |PED(F)'
04100 - | | | | |
04200 ⊗ ⊗ ⊗ V1→ ⊗-------⊗ ←V2
04300 + | | | | |
04400 | | FNEW | F below | |
04500 - | | | | |
04600 ⊗ ⊗ ⊗ ⊗ FNEW ⊗
04700 + | | | | |
04800 | | | | |
04900 - | | | | |
05000 ⊗ ⊗-------⊗ ⊗-------⊗ .
05100 DECLARE{FACE,FNEW,NN,V1,V2,E}
05200 BEND;2/7/73-------------------------------------------------------
00100 SUBR(ROTCOM)FACE--------------------------------------------------
00200 BEGIN ROTCOM;SOLID OF ROTATION COMLETION - BGB -8 FEB 1973.
00300 ACCUMULATORS{F,E,E0,M,N}
00400 LAC F,ARG1↔DAC F,FACE↔TEST F,FBIT↔POP1J
00500 NCNT N,F↔DACM N,NN↔SKIPN↔POP1J
00600
00700 ;COUNT THE EDGES IN THIS FACE.
00800 LACI M,1↔PED E,F↔DAC E,E0↔DAC E,EDGE
00900 L1: SETQ(E,{ECCW,E,F})
01000 CAME E,E0↔AOJA M,L1
01100
01200 ;SKIP AROUND THE NORTH POLE CAP.
01300 ASH M,-1↔SUB M,NN
01400 SETQ(V1,{VCW,EDGE,FACE})
01500 LAC 1,EDGE
01600 L2: CALL(ECW,1,FACE)↔SOJG M,L2
01700 SETQ(V2,{VCW,1,FACE})
01800 SETQ(EDGE,{MKFE,V2,FACE,V1}) ;CLOSE THE TOP OF THE GAP.
01900
02000 ;FOLLOW DOWN THE GAP.
02100 L3: CALL(ECCW,EDGE,FACE)↔SETQ(V1,{OTHER,1,V1})
02200 CALL(ECW,EDGE,FACE)↔SETQ(V2,{OTHER,1,V2})
02300 SETQ(EDGE,{MKFE,V2,FACE,V1})
02400 SOSLE NN↔GO L3
02500 SETZ↔LAC 1,FACE↔NCNT. 0,1
02600 POP1J
02700 COMMENT .
02800 ⊗---⊗---⊗----⊗---⊗
02900 | GAP | ← POLE CAP
03000 | ↓ |
03100 ⊗-----⊗←←←←⊗-----⊗ ← ARTIC CIRCLE
03200 PED(F)→| |
03300 | |
03400 V1' ⊗←←←←⊗ V2'
03500 | F |
03600 | |
03700 ⊗-----⊗ ⊗-----⊗ ← ANTARTIC CIRCLE.
03800
03900 DECLARE{FACE,EDGE,V1,V2,NN}
04000 BEND;2/8/73-------------------------------------------------------
00100 SUBR(PYRAMID)FACE OR VERTEX---------------------------------------
00200 BEGIN PYRAMID
00300
00400 LAC 1,ARG1↔TEST 1,VBIT↔GO L2
00500 ;VERTEX ARGUMENT - GIVEN THE PEAK FORM THE BASE.
00600 DAC 1,V
00700 PED 2,1↔DAC 2,E0↔DAC 2,E2
00800 SETQ(V2,{OTHER,E2,V})
00900 L1: LAC E2↔DAC E1
01000 LAC V2↔DAC V1
01100 SETQ(E2,{ECCW,E1,V})
01200 SETQ(V2,{OTHER,E2,V})
01300 CALL(LINKED,V1,V2)↔JUMPE 1,[ ;WHEN NOT LINKED.
01400 CALL(FCCW,E1,V)
01500 CALL(MKFE,V1,1,V2)↔GO .+1]
01600 LAC E2↔CAME E0↔GO L1
01700 LAC 1,ARG1↔POP1J
01800 DECLARE{V,V1,V2,E0,E1,E2}
01900
02000 ;FACE ARGUMENT - GIVEN THE BASE FORM THE PEAK.
02100 L2: DAC 1,F↔TEST 1,FBIT↔POP1J
02200 SETZM X↔SETZM Y↔SETZM Z↔SETZM N
02300 PED 2,1↔DAC 2,E↔DAC 2,E0
02400 SETQ(V0,{VCW,E0,F})
02500 SETQ(PEAK,{MKEV,F,V0})
02600 L3: SETQ(V,{VCCW,E,F})
02700 LAC XWC(1)↔FADRM X
02800 LAC YWC(1)↔FADRM Y
02900 LAC ZWC(1)↔FADRM Z
03000 AOS N↔CAMN 1,V0↔GO L4
03100 SETQ(E,{ECCW,E,F})
03200 CALL(MKFE,PEAK,F,V)
03300 GO L3
03400 L4: LAC 1,PEAK↔LAC 2,N↔FLOAT 2,
03500 LAC X↔FDVR 2↔DAC XWC(1)
03600 LAC Y↔FDVR 2↔DAC YWC(1)
03700 LAC Z↔FDVR 2↔DAC ZWC(1)
03800 POP1J
03900 DECLARE{PEAK,F,E,V0,X,Y,Z,N}
04000
04100 BEND;2/8/73-------------------------------------------------------
00100 SUBR(REMOVF)FACE-------------------------------------------------
00200 BEGIN REMOVE; REMOVE A FACE FROM A POLYHEDRON - BGB - 7 FEB 1973.
00300 LAC 1,ARG1↔TEST 1,FBIT↔POP1J↔DAC 1,F
00400 PED 2,1↔DAC 2,E
00500 SETQ(V0,{VCW,E,F})
00600 SETQ(V,{VCCW,E,F})↔SLACI XWC(1)↔LAPI X↔BLT Z
00700 SETQ(A,{ECCW,E,F})
00800 SETQ(F,{KLFE,E})
00900 LACI 1↔DAC N
01000 L1: LAC 1,A↔DAC 1,E
01100 PVT 0,1↔CAMN 0,V↔GO[CALL(INVERT,E)↔GO .+1]
01200 SETQ(A,{ECCW,A,F})
01300 SETQ(V,{KLVE,E})
01400 LAC XWC(1)↔FADRM X
01500 LAC YWC(1)↔FADRM Y
01600 LAC ZWC(1)↔FADRM Z↔AOS N
01700 CAME 1,V0↔GO L1
01800 ;PLACE VERTEX AT CENTER OF DECEASED FACE.
01900 LAC 2,N↔FLOAT 2,
02000 LAC X↔FDVR 2↔DAC XWC(1)
02100 LAC Y↔FDVR 2↔DAC YWC(1)
02200 LAC Z↔FDVR 2↔DAC ZWC(1)
02300 POP1J
02400 DECLARE{F,E,V,V0,A,X,Y,Z,N}
02500 BEND;2/10/73-----------------------------------------------------
00100 SUBR(FVDUAL)BODY-------------------------------------------------
00200 BEGIN FVDUAL; FACE-VERTEX DUAL - BGB - 20 FEBRUARY 1973.
00300 ACCUMULATORS{B,F,E,V,E0,X,Y,Z,I}
00400 LAC B,ARG1↔TEST B,BBIT↔POP1J
00500
00600 ;FOR ALL THE FACES OF THE BODY.
00700 LAC F,B
00800 L1: PFACE F,F↔TEST F,FBIT↔GO L3
00900 SETZB X,Y↔SETZB Z,I
01000 PED E,F↔DAC E,E0
01100
01200 ;COMPUTE CENTER OF EACH FACE.
01300 L2: SETQ(V,{VCCW,E,F})
01400 SETQ(E,{ECCW,E,F})
01500 FADR X,XWC(V)↔FADR Y,YWC(V)↔FADR Z,ZWC(V)
01600 AOS I
01700 CAME E,E0↔GO L2
01800
01900 ;CONVERT FACES INTO VERTICES.
02000 FLOAT I,↔FDVR X,I↔FDVR Y,I↔FDVR Z,I
02100 DAC X,XWC(F)↔DAC Y,YWC(F)↔DAC Z,ZWC(F)
02200 LAC 1(F)↔DAC 3(F)↔SLACI(VBIT)↔DAC(F)
02300 GO L1
02400
02500 ;CONVERT VERTICES INTO FACES.
02600 L3: LAC V,ARG1↔LACI 1,2↔LAC E,ARG1
02700 L4: PVT V,V↔TEST V,VBIT↔GO L5
02800 LAC 3(V)↔DAC 1(V)↔DIP 1,(V)↔GO L4
02900
03000 ;TURN ALL THE EDGES OVER AND INSIDE OUT.
03100 L5: PED E,E↔TEST E,EBIT↔GO L6
03200 LAC 1(E)↔EXCH 3(E)↔DAC 1(E)
03300 MOVSS 1(E)
03400 MOVS 4(E)↔MOVE 1,5(E)
03500 DAC 1,4(E)↔DAC 5(E)
03600 GO L5
03700
03800 L6: LAC B,ARG1↔LAC 1(B)↔EXCH 3(B)↔DAC 1(B)
03900 POP1J
04000 BEND;2/10/73-----------------------------------------------------
00100 END
00200 EULER.FAI - EOF.